Thread sleep() 和 wait()

sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出CPU给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后又会自动恢复运行状态。

wait()方法是Object类里面的,主要的意义就是让线程放弃当前的对象的锁,进入等待此对象的等待锁定池,只有针对此对象调动notify方法后本线程才能够进入对象锁定池准备获取对象锁进入运行状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

public class ThreadSleepWait {
/** java中的sleep()和wait()的区别 */
public static void main(String[] args) {
new Thread(new Thread1()).start();
try {
System.out.println("主线程Sleep");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Thread2()).start();
}

private static class Thread1 implements Runnable{
@Override
public void run(){
synchronized (ThreadSleepWait.class) {
System.out.println("启动线程" + Thread.currentThread().getName());
System.out.println("线程等待中...");
try {
//调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
ThreadSleepWait.class.wait();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程1继续");
System.out.println("线程1结束");
}
}
}

private static class Thread2 implements Runnable{
@Override
public void run(){
synchronized (ThreadSleepWait.class) {
System.out.println("启动线程" + Thread.currentThread().getName());
System.out.println("线程等待中...");
//只有针对此锁对象调用notify后
//本线程才进入对象锁定池准备获取对象锁进入运行状态。
ThreadSleepWait.class.notify();

//区别
//如果我们把代码:ThreadSleepWait.class.notify给注释掉,
//ThreadSleepWait.class调用了wait()方法但是没有调用notify()方法,
//则线程1永远处于挂起状态。

try {
//Sleep方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
//但是他的监控状态依然保持者,当指定的时间过又会自动恢复运行状态。
//在调用sleep方法的过程中,线程不会释放对象锁。
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程2继续");
System.out.println("线程2结束");
}
}
}
}

运行效果:

1
2
3
4
5
6
7
8
9
主线程Sleep
启动线程Thread-0
线程等待中...
启动线程Thread-1
线程等待中...
线程2继续
线程2结束
线程1继续
线程1结束

如果注释掉代码,之后调用

1
ThreadSleepWait.class.notify();

运行效果:

1
2
3
4
5
6
7
主线程Sleep
启动线程Thread-0
线程等待中...
启动线程Thread-1
线程等待中...
线程2继续
线程2结束